/**
 * 数据库操作模块
 * 基于node-mysql库封装
 * 自动加载配置文件、创建连接池
 */

'use strict';

const path=require('path');
const nconf = require('nconf');
const mysql=require('mysql');
const tools=require("./tools.js");


const sqlPath=path.resolve(__dirname,'../../database.json');

/**
 * 加载公共配置文件，应该包含以下信息：
 * -database
 * -
 */
nconf.file('database',{
    file:sqlPath
})


console.dir(nconf.get('database'))

/**
 * 创建连接池
 * @type {Pool}
 */
let pool  = mysql.createPool(nconf.get('database'));


let me={

    /**
     * SQL查询字符串 方法
     *
     * 详情查看node-mysql官方文档
     *
     * 推荐使用参数格式：
     *
     * 1、查询时推荐使用的格式
     * [sql{String},params{Array}]
     * 如：
     * connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) {});
     *
     * 2、update、insert推荐使用格式
     * [sql{String},params{Object}]
     * 如：
     * var post  = {id: 1, title: 'Hello MySQL'};
     * connection.query('INSERT INTO posts SET ?', post, function(err, result) {})
     *
     * 3、需要配置高级查询的时候使用的格式
     * [params{Object}:sql,timeout,values]
     *
     * @param params
     * @returns {Promise}
     */
    query(...params){
        return new Promise((resolve)=>{
            pool.getConnection(function(err, connection) {
                connection.query(...params,(error, results)=> {
                    if(error){
                        resolve(tools.sqlError(error));
                    }else{
                        if(me.isArray(results)){
                            resolve(tools.success(results));
                        }else{
                            resolve(tools.success("success"));
                        }
                    }
                    connection.release();
                });

            });


        })
    },

    transaction(){
        return new Promise((resolve,reject)=>{
            pool.getConnection(function(err,connection) {
                if(err){
                    reject(err)
                }else{
                    resolve(connection);
                }
            })
        })
    },

    isArray(data){
        return '[object Array]'==Object.prototype.toString.call(data)
    },

    query2(...params){
        return new Promise((resolve)=>{
            let _query=pool.query(...params,(error, results, fields)=> {
                resolve({
                    error,
                    results,
                    fields,
                    _query
                })
            });
        })
    },

    updates(tableName,keyObj,data){
        let keyParam="";
        for(var a in keyObj){
            keyParam=a+"="+keyObj[a];
        }
        let sqlStr=`UPDATE ${tableName} SET ? WHERE ${keyParam}`;
        return this.query({
            sql:sqlStr,
            typeCast: this.nulls
        },data)
    },

    //null值转为空字符串
    nulls(field){
        return field.string()||"";
    }
}

module.exports=me;